#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <elf.h>

// 这段代码主要用于将二进制文件的内容转换为 COE 文件的格式，COE 文件通常用于初始化数字电路的存储器
int main(int argc, char *argv[])
{
	FILE *in;
	FILE *out;

	// 存储可执行文件中的代码段
	uint8_t *file_bin_name = malloc(80);
	// 存储可执行文件中的数据段
	uint8_t *file_data_name = malloc(80);

	int i, j, k, n;
	unsigned char mem[32];

	strcat(file_bin_name, argv[1]);
	strcat(file_data_name, argv[2]);

	in = fopen(file_bin_name, "rb");
	out = fopen("inst_rom.coe", "w");

	fprintf(out, "memory_initialization_radix = 16;\n");
	fprintf(out, "memory_initialization_vector =\n");
	// 使用 fread 读取4字节的二进制数据到 mem 缓冲区，每次读取4个字节。
	// 使用 fprintf 将这4个字节的数据以16进制格式写入 "inst_rom.coe" 文件。
	while (!feof(in))
	{
		if (fread(mem, 1, 4, in) == 4)
			fprintf(out, "%02x%02x%02x%02x\n", mem[0], mem[1], mem[2], mem[3]);
	}
	fclose(in);
	fclose(out);

	in = fopen(file_data_name, "rb");
	out = fopen("data_ram.coe", "w");

	fprintf(out, "memory_initialization_radix = 16;\n");
	fprintf(out, "memory_initialization_vector =\n");
	// 使用 fread 读取4字节的二进制数据到 mem 缓冲区，每次读取4个字节。
	// 使用 fprintf 将这4个字节的数据以16进制格式写入 "inst_rom.coe" 文件。
	while (!feof(in))
	{
		n = fread(mem, 1, 4, in);
		int index;
		if (n != 4)
		{
			for (index = 0; index < n; index++)
				fprintf(out, "%02x", mem[index]);
			break;
		}
		fprintf(out, "%02x%02x%02x%02x\n", mem[0], mem[1], mem[2], mem[3]);
	}
	fclose(in);
	fclose(out);

	return 0;
}
